//这个文件是用来进行自己写的基于唤醒队列的生产者消费者模型的测试
#include"RingQueue.hpp"
#include<unistd.h>
class threadate
{
public:
    RingQueue<int> *rq;
    std :: string name;
}; //因为线程会有自己的名字，所以弄个类来保存名字和循环队列

int data = 0;

void* produter(void* args)
{
    threadate* s1 = static_cast<threadate*>(args); //强转
    //生产者进行任务的产生
    while(1)
    {
        std :: cout << s1->name <<  "    生产者生产了一个任务:  " << data << std :: endl;
        s1->rq->Equeue(data); //往里面放入任务
        data++;
    }
    return nullptr;
}
void* consumer(void* args)
{
    threadate* s1 = static_cast<threadate*>(args); //强转
    while(1)
    {
        //消费任务，消费者进行任务的
        sleep(1);
        int t = 0;
        s1->rq->Pop(&t);
        std :: cout << s1->name << "    消费者拿到了一个任务:  " << t << std :: endl;
    }
    return nullptr;
}
int main()
{
    RingQueue<int>* rq = new RingQueue<int>();  //咱就用默认的五个长度就好
    pthread_t c[2],q[3];  //设置两个线程，分别表示生产者和消费者
    threadate s1; //生产者
    s1.rq = rq;
    s1.name = "thread -1";
    pthread_create(c,nullptr,consumer,&s1);
    threadate s3; //生产者
    s3.rq = rq;
    s3.name = "thread -2";
    pthread_create(c + 1,nullptr,consumer,&s3);
    threadate s2; //消费者
    s2.rq = rq;
    s2.name = "thread -3";
    pthread_create(q,nullptr,produter,&s2);
    threadate s4; //消费者
    s4.rq = rq;
    s4.name = "thread -4";
    pthread_create(q + 1,nullptr,produter,&s4);
    threadate s5; //消费者
    s5.rq = rq;
    s5.name = "thread -5";
    pthread_create(q + 2,nullptr,produter,&s5);
    //线程等待，不然就会导致直接退出
    pthread_join(c[0],nullptr);
    pthread_join(c[1],nullptr);
    pthread_join(q[0],nullptr);
    pthread_join(q[1],nullptr);
    pthread_join(q[2],nullptr);
    //比较乱，线程池可以解决比较乱的问题
    return 0;
}